# 将函数作为参数，传递进入另一个函数----高阶函数

# max / min
data = [
    {'name': '张三', 'gender': 'male', 'age': 27, 'score': 88},
    {'name': '李四', 'gender': 'female', 'age': 21, 'score': 66},
    {'name': '王五', 'gender': 'male', 'age': 24, 'score': 73},
    {'name': '赵六', 'gender': 'female', 'age': 20, 'score': 92},
    {'name': '孙七', 'gender': 'female', 'age': 22, 'score': 80},
]

print("年龄最大的人", (max(data, key=lambda x: x["age"]))["name"])
print("分数最低的人", (min(data, key=lambda x: x["score"]))["name"])

# sorted 
print("重排序", sorted(data, key=lambda x: x["score"], reverse=True))


# map  对后者列表中的每个元素都执行一次前者函数处理，返回一个新的列表
# map(function,iterable)

def square(x):
    return x * x
## 等价于 lambda x: x*x

numbers = [3,2,1,4]
print(list(map(square,numbers)))


# filter 函数： 对后者列表中的每个元素都执行一次前者函数处理，返回一个新的列表（只保留true的元素）
def is_even(x):
    return x%2 == 0
print(list(filter(is_even,numbers)))


# reduce 函数 ，它接受一个函数和一个可迭代对象作为参数，并且返回一个单一的累积结果。如阶乘、幂运算等。
from functools import reduce
print(reduce(lambda x,y: x*y, numbers))